#include "SymboleValue.h"
#include "Valeur.h"
#include <stdlib.h>
using namespace std;

////////////////////////////////////////////////////////////////////////////////

SymboleValue::SymboleValue(Symbole s) :
Symbole(s.getChaine()) {
    if (s == "<ENTIER>") {
        this->setValeur(new ValeurEntiere(atoi(s.getChaine().c_str()))); // c_str convertit une string en char*
        this->defini = true;
    } else if (s == "<REEL>") {
        this->setValeur(new ValeurReelle(atof(s.getChaine().c_str())));
        this->defini = true;
    } else if (s == "<CHAINE>") {
        this->setValeur(new ValeurChaine(s.getChaine()));
        this->defini = true;
    } else if (s == "<CARACTERE>") {
        this->setValeur(new ValeurCaractere(s.getChaine().c_str()));
        this->defini = true;
    } else if (s == "<VARIABLE>") {
        this->setValeur(new ValeurEntiere(42));
        this->defini = false;
    } else {
        cout << "Le symbole n'est pas un symbole valué" << endl;
        exit(0);
    }
}

////////////////////////////////////////////////////////////////////////////////

void SymboleValue::afficher(unsigned short indentation) {
    Noeud::afficher(indentation);
    cout << "Feuille - Symbole value : " << getChaine() << endl; // on affiche la chaine du symbole
}

////////////////////////////////////////////////////////////////////////////////
// Attention : cette fonction (operator) n'est pas membre de la classe SymboleValue

ostream & operator <<(ostream & cout, SymboleValue symb) {
    if (symb.defini) {
        if (symb.getValeur()->estEntiere()) {
            cout << (Symbole) symb << "\t\t - Valeur=" << dynamic_cast<ValeurEntiere*> (symb.getValeur())->getValeur() << endl;
        } else if (symb.getValeur()->estReelle()) {
            cout << (Symbole) symb << "\t\t - Valeur=" << dynamic_cast<ValeurReelle*> (symb.getValeur())->getValeur() << endl;
        } else if (symb.getValeur()->estChaine()) {
            cout << (Symbole) symb << "\t\t - Valeur=" << dynamic_cast<ValeurChaine*> (symb.getValeur())->getValeur() << endl;
        } else if (symb.getValeur()->estCaractere()) {
            cout << (Symbole) symb << "\t\t - Valeur=" << dynamic_cast<ValeurCaractere*> (symb.getValeur())->getValeur() << endl;
        }
    } else {
        cout << (Symbole) symb << "\t\t - Valeur=Indefinie" << endl;
    }
    return cout;
}
